import axios from 'axios';
import { getToken, setToken } from "../utils/localStorage";
import { refreshLogin } from '@/utils/codeLogin.js';
import { Toast } from 'antd-mobile';

// 创建 axios 实例
const service = axios.create({
    baseURL: process.env.REACT_APP_API_BASE_URL || '/app-api',
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json',
        'tenant-id': '1'
    },
});

// 🔴 新增：请求刷新相关状态管理
let isRefreshing = false; // 刷新token锁
let requestQueue = []; // 等待刷新的请求队列

/**
 * 🔴 新增：重试队列中的请求
 * @param {string} newToken - 新token
 */
function retryRequests(newToken) {
    requestQueue.forEach(({ config, resolve, reject }) => {
        // 更新请求头中的token
        config.headers["Authorization"] = "Bearer " + newToken;
        // 重试请求
        service(config).then(resolve).catch(reject);
    });
    // 清空队列
    requestQueue = [];
}

let noLoading = null
// 请求拦截器
service.interceptors.request.use(
    config => {
        console.log('请求配置：', config)
        const noToken = config.noToken === true;
        noLoading = config.noLoading === true;
        console.log('config.noLoadingconfig.noLoadingconfig.noLoadingconfig.noLoading', config.noLoading)

        // 测试代码，默认设置一个token，方便调试
        // setToken('9fad4920b40645a994445050071ca9ea')

        if (getToken() && !noToken) {
            config.headers["Authorization"] = "Bearer " + getToken();
        }
        if (!noLoading) {
            Toast.show({ icon: 'loading', content: '加载中…', duration: 0 })
        }
        return config;
    },
    error => {
        // 🔴 新增：请求取消时不抛出错误（如页面跳转取消请求）
        if (axios.isCancel(error)) {
            console.log('🔄 请求已取消：', error.message);
            return Promise.resolve({ data: { code: -1, msg: '请求已取消' } });
        }
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    async response => {
        Toast.clear()

        const { data, config } = response;

        // 1. 正常响应（非401）
        if (data.code !== 401) {
            return data;
        }

        // 2. 处理token过期（code=401）
        // 🔴 新增：重试标记（避免无限循环）
        if (config._retry) {
            console.error('❌ 刷新token后仍401，需重新登录');
            return Promise.reject(new Error('token无效，请重新登录'));
        }
        config._retry = true;

        // 3. 刷新token逻辑
        if (!isRefreshing) {
            isRefreshing = true;
            try {
                // 调用refreshLogin获取新token
                const { accessToken: newToken } = await refreshLogin();
                console.log('🔄 token已刷新：', newToken?.slice(0, 10) + '...');
                // 保存新token
                setToken(newToken);
                // 更新全局请求头
                service.defaults.headers.common["Authorization"] = "Bearer " + newToken;
                // 重试队列中的请求
                retryRequests(newToken);
                // 重试当前请求
                return service(config);
            } catch (refreshError) {
                console.error('❌ 刷新token失败：', refreshError.message);
                // 刷新失败，清空队列（避免无效重试）
                requestQueue = [];

                return Promise.reject(new Error('飞书授权失败，请使用飞书打开页面'));
            } finally {
                isRefreshing = false;
            }
        } else {
            // 4. 若正在刷新token，加入队列等待
            return new Promise((resolve, reject) => {
                requestQueue.push({ config, resolve, reject });
            });
        }
    },
    error => {
        // 🔴 优化：区分网络错误和业务错误
        Toast.clear()
        let errorMsg = '';
        if (!error.response) {
            errorMsg = '网络异常，请检查网络连接';
        } else {
            errorMsg = `请求失败：${error.response.status} ${error.response.statusText}`;
        }
        console.error('❌ 响应错误：', errorMsg);
        return Promise.reject(new Error(errorMsg));
    }
);

export default service;